package com.longcai.service.saobeipay.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.gson.JsonObject;
import com.longcai.bean.ApiResult;
import com.longcai.constants.SaoBeiConstants;
import com.longcai.convert.SaoBeiPaymentHandler;
import com.longcai.entity.payment.saobei.request.ClyjSaobeiPaymentLogReq;
import com.longcai.entity.payment.saobei.response.ClyjSaobeiPaymentRefundResp;
import com.longcai.entity.payment.weixin.request.ClyjSaoBeiWeiXinJsApiRequest;
import com.longcai.enums.ResultEnum;
import com.longcai.mapper.saobeipay.ClyjSaobeiPaymentLogMapper;
import com.longcai.service.handler.SaoBeiPaymentLogicHandler;
import com.longcai.service.saobeipay.ClyjSaobeiPaymentLogService;
import com.longcai.utils.fuyoupay.PaymentSendPost;
import com.longcai.vo.payment.saobei.ClyjSaobeiPaymentLogVo;
import com.longcai.vo.payment.saobei.ClyjSaobeiPaymentQuery;
import com.longcai.vo.payment.saobei.ClyjSaobeiPaymentRefund;
import com.longcai.vo.payment.saobei.ClyjSaobeiTradeNotify;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;

/****
 *
 * @author 作者: hyf

 * @version 创建时间：2019年4月9日 上午10:50:08

 * 类说明 : 利楚扫呗（公众号预支付（统一下单）） 服务实现类
 */
@Service
public class ClyjSaobeiPaymentLogServiceImpl extends ServiceImpl<ClyjSaobeiPaymentLogMapper, ClyjSaobeiPaymentLogReq> implements ClyjSaobeiPaymentLogService {

    @Autowired
    private ClyjSaobeiPaymentLogMapper clyjSaobeiPaymentLogMapper;
    @Autowired
    private SaoBeiPaymentLogicHandler saoBeiPaymentLogicHandler;

    /**
     * 利楚扫呗 发送预下单接口,调用微信JSAPI
     **/
    @Override
    public ApiResult<?> jspay(ClyjSaobeiPaymentLogVo clyjSaobeiPaymentLogVo) {
        /****
         * 0.会话判断
         * 1.扫呗统一下单 请求参数校验。
         * 2.组装参数
         * 3.发送扫呗post请求
         * 4.响应参数校验 验签
         * 5.入库操作
         */
        /**0.获取会话判断**/
        /**1.扫呗统一下单 请求参数校验**/
        ApiResult<?> resul = saoBeiPaymentLogicHandler.checkJspayRequestParam(clyjSaobeiPaymentLogVo);
        if (!resul.getCode().equals(SaoBeiConstants.SUCCESS)) {
            return ApiResult.fail(ResultEnum.BAD_REQUEST_PARAMETER);
        }
        /**微信openId  用户标识（微信openid，支付宝userid），pay_type为010及020时需要传入**/
        String open_id = "oIsd61L5qaOTIdrX86u9GMbThHF4";
        /**发起预支付下单回调的接口**/
        String notify_url = SaoBeiConstants.notify_url;
        /**2.组装统一下单预支付请求参数**/
        String json = new SaoBeiPaymentHandler().SaoBeiPaymentLogReq(clyjSaobeiPaymentLogVo, notify_url, open_id);
        /**3.发送扫码post请求响应结果**/
        String resultJson = new PaymentSendPost().post(SaoBeiConstants.PREPAYMENT, json);
        /**4.扫呗统一下单  响应参数校验 验签**/
        ApiResult<?> results = saoBeiPaymentLogicHandler.checkJspayResponseParam(resultJson);
        if (!results.getCode().equals(SaoBeiConstants.SUCCESS)) {
            return results;
        }
        ClyjSaoBeiWeiXinJsApiRequest clyjSaoBeiWeiXinJsApiRequest = (ClyjSaoBeiWeiXinJsApiRequest) results.getData();
        /**5.入库操作**/
        ClyjSaobeiPaymentLogReq clyjSaobeiPaymentLogReq = new SaoBeiPaymentHandler().SaoBeiPaymentLogconvert(clyjSaobeiPaymentLogVo, open_id);
        clyjSaobeiPaymentLogReq.setId(UUID.randomUUID().toString().replace("-", ""));
        clyjSaobeiPaymentLogReq.setOut_trade_no(clyjSaoBeiWeiXinJsApiRequest.getOut_trade_no());
        //状态标识 0-扫呗预下单成功，微信JSAPI未成功   1—扫呗预支付成功，微信支付成功
        clyjSaobeiPaymentLogReq.setState("0");
        clyjSaobeiPaymentLogReq.setApp_id(clyjSaoBeiWeiXinJsApiRequest.getAppId());
        clyjSaobeiPaymentLogReq.setNonce_str(clyjSaoBeiWeiXinJsApiRequest.getNonceStr());
        Integer i = clyjSaobeiPaymentLogMapper.insert(clyjSaobeiPaymentLogReq);
        if (i > 0) {
            return ApiResult.success(clyjSaoBeiWeiXinJsApiRequest);
        }
        return ApiResult.fail(ResultEnum.SAVE_SAOBEI_PAYMENT_LOG_FAIL);
    }


    /****
     * 利楚扫呗 发送预下单接口,回调接口(交易查询)
     */
    @Override
    public ApiResult<?> jspayNotify(ClyjSaobeiTradeNotify clyjSaobeiTradeNotify) {
        /****
         * 1.校验请求参数，验签
         * 2.校验订单    查询库中书否有订单
         * 3.更改预支付订单状态，并响应
         */
        //1.1.校验请求参数，验签
        ApiResult<?> r = saoBeiPaymentLogicHandler.checkJspayNotifyRequestParam(clyjSaobeiTradeNotify);
        if (!r.getCode().equals(SaoBeiConstants.SUCCESS)) {
            return r;
        }
        //2.校验订单    查询库中书否有订单
        List<ClyjSaobeiPaymentLogReq> list = quweyClyjSaobeiPaymentLogReqList(clyjSaobeiTradeNotify.getUser_id(), clyjSaobeiTradeNotify.getTotal_fee(), clyjSaobeiTradeNotify.getOut_trade_no());
        if (list.size() < 1) {
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_NOTIFY_ORDER_NOTHING);
        }
        //防止重复回调     State状态标识 0-扫呗预下单成功，微信JSAPI未成功   1—扫呗预支付成功，微信支付成功
        if (list.get(0).getState().equals("1")) {
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_NOTIFY_REPEAT);
        }
        //3.更改预支付订单状态，并响应
        ClyjSaobeiPaymentLogReq clyjSaobeiPaymentLogReq = list.get(0).setState("1");
        int i = clyjSaobeiPaymentLogMapper.updateById(clyjSaobeiPaymentLogReq);
        if (i > 0) {
            JsonObject j = new JsonObject();
            j.addProperty("return_code", SaoBeiConstants.RETURN_SUCCESS);
            j.addProperty("return_msg", SaoBeiConstants.SUCCESS);
            return ApiResult.success(j);
        }
        ;
        return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_NOTIFY_UPDATE_FAIL);

    }

    /****
     * 2.扫呗回调接口       查询库中是否有预支付订单数据
     */
    public List<ClyjSaobeiPaymentLogReq> quweyClyjSaobeiPaymentLogReqList(String user_id, BigDecimal total_fee, String out_trade_no) {
        QueryWrapper<ClyjSaobeiPaymentLogReq> w = new QueryWrapper<ClyjSaobeiPaymentLogReq>();
        w.eq("open_id", user_id);
        w.eq("total_fee", total_fee);
        w.eq("out_trade_no", out_trade_no);
        List<ClyjSaobeiPaymentLogReq> list = clyjSaobeiPaymentLogMapper.selectList(w);
        return list;
    }


    /****
     *利楚扫呗  退款申请
     */
    @Override
    public ApiResult<?> refund(ClyjSaobeiPaymentRefund clyjSaobeiPaymentRefund) {
        ApiResult<?> r = saoBeiPaymentLogicHandler.checkRefundRequestParam(clyjSaobeiPaymentRefund);
        if (!r.getCode().equals(SaoBeiConstants.SUCCESS)) {
            return r;
        }
        /**2.组装统一下单预支付请求参数**/
        String json = new SaoBeiPaymentHandler().SaoBeiPaymentRefund(clyjSaobeiPaymentRefund);
        /**3.发送扫码post请求响应结果**/
        String resultJson = new PaymentSendPost().post(SaoBeiConstants.REFUND, json);
        /**4.扫呗统一下单  响应参数校验 验签**/
        ApiResult<?> results = saoBeiPaymentLogicHandler.checkRefundResponseParam(resultJson);
        if (!results.getCode().equals(SaoBeiConstants.SUCCESS)) {
            return results;
        }
        /****
         * 退款响应成功的逻辑
         */
        ClyjSaobeiPaymentRefundResp cresp = (ClyjSaobeiPaymentRefundResp) r.getData();
        ClyjSaobeiPaymentLogReq creq = new SaoBeiPaymentHandler().SaoBeiPaymentRefundconvert(clyjSaobeiPaymentRefund);
        creq.setOut_refund_no(cresp.getOut_refund_no());
        creq.setRefund_fee(cresp.getRefund_fee());
        creq.setEnd_time(cresp.getEnd_time());
        int i = clyjSaobeiPaymentLogMapper.insert(creq);
        if (i < 1) {
            return ApiResult.fail(ResultEnum.SAOBEI_PAYMENT_REFUND_INSERT_FAIL);
        }
        return ApiResult.success();
    }


    /****
     *利楚扫呗  支付查询
     */
    @Override
    public ApiResult<?> query(ClyjSaobeiPaymentQuery clyjSaobeiPaymentQuery) {
        ApiResult<?> r = saoBeiPaymentLogicHandler.checkQueryRequestParam(clyjSaobeiPaymentQuery);
        if (!r.getCode().equals(SaoBeiConstants.SUCCESS)) {
            return r;
        }
        /**2.组装支付查询请求参数**/
        String json = new SaoBeiPaymentHandler().SaoBeiPaymentQuery(clyjSaobeiPaymentQuery);
        /**3.发送扫码post请求响应结果**/
        String resultJson = new PaymentSendPost().post(SaoBeiConstants.QUERYPAYMENT, json);
        /**4.扫呗统一下单  响应参数校验 验签**/
        ApiResult<?> results = saoBeiPaymentLogicHandler.checkQueryResponseParam(resultJson);
        if (!results.getCode().equals(SaoBeiConstants.SUCCESS)) {
            return results;
        }
        /****
         * 退款响应成功的逻辑
         */
        return null;
    }
}
